var fs = require('fs');
var tools = require('./tools.js');
var iCalParser = require('./iCalParser.js');

var RendezVous = function RendezVous() {

    this.dateIntervention = "";
    this.heureIntervention = "";
    this.duree = null;
    this.responsable = "";
    this.lieu = "";
    this.descCSV = "";
};

//Contient tous les RendezVous d'une personne pour une journée donnée.
var PlanningJour = function PlanningJour() {

    this.jour = null;
    this.listeRendezVous = [];

    // heureIntervention: 1230 = 12:30
    // dateIntervention: YYYY-MM-DD 
    // duree: 1.5 => 1h30
};

//Agrége une semaine de PlanningJour (7)
var Semaine = function Semaine() {

    this.listePlanning = [];

    //semaine: 0-6 => 0-Lundi, 1-Mardi etc...   

};

Semaine.prototype.toCSV = function(filePath) {

    var tabToWrite = [];

    //Initialisation de la première ligne
    tabToWrite.push(["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]);


    //On ajoute l'ensemble des rendez-vous de la semaine
    for (var i = 0; i < 48; i++) {
        tabToWrite.push(tools.getRDVAllDays(i, this));
    }

    var stringCSV = tools.arrayToCSV(tabToWrite);

    fs.writeFile(filePath, stringCSV, function(err) {
        if (err) {
            console.log(err);
        } else {
            console.log("Export CSV Done !");
        }
    });
};

//Suppose que les champs ne contiennent pas de points-virgules
//Suppose que les parentheses servent uniquement à séparer les champs description et lieu
//TODO : check erreur ouverture - passage synchrone ?
Semaine.prototype.fromCSV = function(filePath) {

    for (var i = 0; i < 7; i++) {
        this.listePlanning[i] = new PlanningJour();
        this.listePlanning[i].jour = i;
    }

    var input = fs.readFileSync(filePath, 'utf8');

    var data = input.split("\n");
    for (var i = 1; i < data.length; i++) {
        data[i] = data[i].split(";");
        for (var j = 0; j < 7; j++) {
            var content = data[i][j];
            if (content !== "vide") {
                this.listePlanning[j].listeRendezVous.push(new RendezVous());
                var currentRDV = this.listePlanning[j].listeRendezVous[i - 1];
                currentRDV.lieu = content.split(/[()]/)[1];
                currentRDV.descCSV = content.split(/[()]/)[0];
                currentRDV.heureIntervention = tools.ARRAYHOURS[i - 1];
                currentRDV.dureeIntervention = 0.5;
            } else {
                this.listePlanning[j].listeRendezVous.push(null);
            }
        }
    }

    console.log("Import CSV Done !");
};

Semaine.prototype.fromICS = function(filePath) {
    var arrayRDV = iCalParser.fromICal(filePath);
    //Création de la liste de jours 
    for (var i = 0; i < 7; i++) {
        this.listePlanning.push(new PlanningJour());
        this.listePlanning[i].jour = i;
        //Remplissage des rdv de chaque jour à null
		//Il y a 48 créneaux de 30min par jour.
        for (var j = 0; j < 48; j++) {
            this.listePlanning[i].listeRendezVous.push(null);
        }
    }

    //On remplit la semaine avec les RendezVous récupérés
    //Suppose que l'ensemble des rendez-vous récupérés ne s'étend pas sur plus d'une semaine
    for (var i = 0; i < arrayRDV.length; i++) {
        var date = new Date(arrayRDV[i].dateIntervention);
        var day = date.getDay();
        this.listePlanning[day].listeRendezVous[tools.ARRAYHOURS.indexOf(arrayRDV[i].heureIntervention)] = arrayRDV[i];
    }
    console.log("Import Ical done !");
};

//Exporte la semaine entière au format iCAL
//NE regroupe PAS les subdivisions en demi-heures ----> un fichier Ical importé puis exporté sera différent
//TODO : gérer réellement le DTSTAMP
Semaine.prototype.toICS = function(filePath) {

    var iCalString = "BEGIN:VCALENDAR\nVERSION:2.0\n";
    for (var i = 0; i < 7; i++) {
        for (var j = 0; j < 48; j++) {
            var currentRDV = this.listePlanning[i].listeRendezVous[j];
            //Le rendezvous doit exister et sa date être précisée (probleme dans l'importation des CSV);
            if (currentRDV !== null && currentRDV.dateIntervention !== "") {
                //Ajout BEGIN
                iCalString += "BEGIN:VEVENT\n";
                //Ajout DTSTAMP : donnée test pour el moment
                iCalString += "DTSTAMP:00000000T000000Z\n";
                //Ajout DTSTART
                var date = currentRDV.dateIntervention.replace(/-/g, "");
                iCalString += "DTSTART:" + date + "T" + currentRDV.heureIntervention + "00Z\n";
                //Ajout DURATION --> Pour le moment tous les evenement stockés sont divisés en 0.5h.
                iCalString += "DURATION:P30M00S\n";
                //Ajout ATTENDEE
                iCalString += "ATTENDEE:" + currentRDV.responsable + "\n";

                //Ajout LOCATION
                iCalString += "LOCATION:" + currentRDV.lieu + "\n";

                //Fin EVENT
                iCalString += "END:VEVENT\n";
            }

        }
    }
    iCalString += "END:VCALENDAR";

    fs.writeFile(filePath, iCalString, function(err) {
        if (err) {
            console.log(err);
        } else {
            console.log("Export ICal Done !");
        }
    });
};

/**
 * The method countInterventions computes the number of interventions in
 * a planning.
 *
 * @return {Number} Number of interventions
 */
Semaine.prototype.countInterventions = function countInterventions() {
    var interventionsCounter = 0;
    this.listePlanning.forEach(function(planning) {
        interventionsCounter += planning.listeRendezVous.length;
    });

    return interventionsCounter;
};

/**
 * The method countDurationInterventions computes the total length of the
 * rendez-vous in the planning.
 *
 * @return {Number} Total duration of the intervention
 */
Semaine.prototype.countDurationInterventions = function countDurationInterventions() {
    var interventionsDurationCounter = 0;
    this.listePlanning.forEach(function(planning) {
        planning.listeRendezVous.forEach(function(rdv) {
            interventionsDurationCounter += rdv.duree;
        });
    });

    return interventionsDurationCounter;
};

//Export des classes
exports.RendezVous = RendezVous;
exports.PlanningJour = PlanningJour;
exports.Semaine = Semaine;